package com.example.android.architecture.blueprints.todoapp.data.source;

import com.example.android.architecture.blueprints.todoapp.data.FakeTasksRemoteDataSource;
import com.example.android.architecture.blueprints.todoapp.data.source.local.TasksLocalDataSource;

import javax.inject.Singleton;

import dagger.Binds;
import dagger.Module;

/**
 * This is used by Dagger to inject the required arguments into the {@link TasksRepository}.
 * 提供给  TasksRepository(@Remote TasksDataSource tasksRemoteDataSource,@Local TasksDataSource tasksLocalDataSource)
 * 进行依赖注入
 * 这里定义成了抽象函数这样就防止了被 new 出来，即在构建该 Module 的时候是没有下面这个方法的
 * DaggerTasksRepositoryComponent.builder()
 .tasksRepositoryModule(new TasksRepositoryModule()))
 */
@Module
abstract class TasksRepositoryModule {

    //定义作用域 Scope
    @Singleton
    @Binds
    //Qualifier 解决注入迷失
    @Local
    abstract TasksDataSource provideTasksLocalDataSource(TasksLocalDataSource dataSource);

    @Singleton
    //@Binds这个注解就想这样：这个就是告诉dagger，这个 TasksDataSource 是用的 FakeTasksRemoteDataSource 类实现的。
    //然，你会注意到这个class是抽象类。这就意味着我们可以添加抽象方法。
    @Binds
    @Remote
    abstract TasksDataSource provideTasksRemoteDataSource(FakeTasksRemoteDataSource dataSource);

}
